package tests;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertNull;
import fachada.Fachada;
import interfaces.IFachada;

import java.util.List;

import modelos.Aluno;

import org.junit.After;
import org.junit.Test;

public class AlunoTest {

	private static IFachada fachada = new Fachada();

	@After
	public void tearDown() throws Exception {
		List<Aluno> alunos = fachada.listarAlunos();
		for(Aluno a : alunos) {
			fachada.removerAluno(a);
		}
	}

	@Test
	public void testSalvarAluno() {
		assertEquals(0, fachada.listarPessoas().size());
		assertEquals(0, fachada.listarAlunos().size());
		
		Aluno a1 = new Aluno();
		a1.setNome("pedro");
		a1.setCpf("000.000.000-00");
		a1.setMatricula(0);
		a1 = fachada.salvarAluno(a1);
		
		assertEquals(1, fachada.listarPessoas().size());
		assertEquals(1, fachada.listarAlunos().size());
		
		Aluno a2 = new Aluno();
		a2.setNome("pedro tiago");
		a2.setCpf("100.000.000-00");
		a2.setMatricula(0);
		a2 = fachada.salvarAluno(a2);
		
		assertNull(a2);
		assertNotSame(2, fachada.listarAlunos().size());
		assertEquals(1, fachada.listarAlunos().size());
	}
	
	@Test
	public void testAtualizarAluno() {
		assertEquals(0, fachada.listarPessoas().size());
		assertEquals(0, fachada.listarAlunos().size());
		
		Aluno a1 = new Aluno();
		a1.setNome("pedro");
		a1.setCpf("000.000.000-00");
		a1.setMatricula(0);
		a1 = fachada.salvarAluno(a1);
		assertNotNull(a1);
		
		a1.setNome("pedro tiago");
		a1 = fachada.atualizarAluno(a1);
		assertNotNull(a1);
		assertNotSame("pedro", a1.getNome());
		assertEquals("pedro tiago", a1.getNome());
		
		Aluno a2 = new Aluno();
		a2.setNome("david");
		a2.setEmail("david@ffm.com.br");
		a2.setCpf("111.111.111-11");
		a2.setMatricula(1);
		a2 = fachada.salvarAluno(a2);
		
		assertEquals(2, fachada.listarPessoas().size());
		assertEquals(2, fachada.listarAlunos().size());
		assertNotNull(a2);
		
		assertEquals("david", a2.getNome());
		assertEquals("david@ffm.com.br", a2.getEmail());
		
		a1.setEmail("pedrotiago@ffm.com.br");
		a1.setMatricula(2);
		a1 = fachada.atualizarAluno(a1);
		assertNotNull(a1);
		assertEquals("pedrotiago@ffm.com.br", a1.getEmail());
		
		assertEquals(1, fachada.getAlunoPorCpf("111.111.111-11").getMatricula());
		assertEquals(2, fachada.getAlunoPorCpf("000.000.000-00").getMatricula());
	}
	
	@Test
	public void testRemoverPessoa() {
		assertEquals(0, fachada.listarPessoas().size());
		assertEquals(0, fachada.listarAlunos().size());
		
		Aluno a1 = new Aluno();
		a1.setNome("pedro");
		a1.setCpf("000.000.000-00");
		a1.setMatricula(0);
		a1 = fachada.salvarAluno(a1);
		
		Aluno a2 = new Aluno();
		a1.setNome("jairo");
		a1.setCpf("222.222.222-22");
		a1.setMatricula(1);
		a1 = fachada.salvarAluno(a1);
		
		Aluno a3 = new Aluno();
		a2.setNome("david");
		a2.setEmail("david@ffm.com.br");
		a2.setCpf("111.111.111-11");
		a2.setMatricula(2);
		a2 = fachada.salvarAluno(a2);
		
		assertEquals(3, fachada.listarPessoas().size());
		assertEquals(3, fachada.listarAlunos().size());
		assertNotNull(a1);
		
		a1 = fachada.getAlunoPorMatricula(1);
		assertNotNull(a1);
		fachada.removerAluno(a1);
		assertEquals(2, fachada.listarPessoas().size());
		assertEquals(2, fachada.listarAlunos().size());
		assertNull(fachada.getAlunoPorMatricula(1));
		
		a1 = fachada.getAlunoPorMatricula(2);
		fachada.removerAluno(a1);
		assertEquals(1, fachada.listarPessoas().size());
		assertEquals(1, fachada.listarAlunos().size());
		assertNull(fachada.getPessoaPorCpf("111.111.111-11"));
		
		a1 = fachada.getAlunoPorCpf("000.000.000-00");
		fachada.removerAluno(a1);
		assertEquals(0, fachada.listarPessoas().size());
		assertEquals(0, fachada.listarAlunos().size());
		assertNull(fachada.getAlunoPorMatricula(0));
	}

}
